package org.example;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

@SuppressWarnings({"all"})
public class Main {
    public static void main(String[] args) throws Exception{
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println(classfullpath);
        System.out.println(methodName);

        //使用反射机制
        //(1) 加载类
        Class cls = Class.forName(classfullpath);
        //(2) 通过 cls 得到类的对象实例
        Object o =  cls.newInstance();
        System.out.println(o.getClass());
        //(3)
        Method method1 = cls.getMethod("cry");
        Method method2 = cls.getMethod("hi");
        //(4) 通过 method1 调用方法: 即通过方法对象来实现调用方法,反射机制 方法.invoke(对象)
        method1.invoke(o);
        method2.invoke(o);

        //java.lang.reflect.Field: 代表类的成员变量, Field 对象表示某个类的成员变量
        //getField不能得到私有属性
        Field name = cls.getField("name");
        System.out.println(name.get(o));

        //java.lang.reflect.Constructor: 代表类的构造方法, Constructor 对象表示构造器
        Constructor constructor = cls.getConstructor();//()中可以指定参数类型，没有就返回无参
        System.out.println(constructor);

        Constructor constructor1 = cls.getConstructor(String.class);
        System.out.println(constructor1);
    }
}